package com.mingyuean.demo.spring.factory.support;

import com.mingyuean.demo.spring.factory.BeanFactory;
import com.mingyuean.demo.spring.factory.config.BeanDefinition;

/**
 * @author MingYueAn
 * <p>
 * 抽象类AbstractBeanFactory实现了接口BeanFactory，提供了获取bean实例的公共方法。
 * 继承了DefaultSingletonBeanRegistry，可以维护bean的单例实例。
 * </p>
 * <p>  2023/3/19 16:12
 * @version: 1.0
 */
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {
    /**
     * 根据beanName获取bean的实例对象
     *
     * @param beanName bean的名称
     * @return 返回bean的实例对象
     */
    @Override
    public Object getBean(String beanName) {
        // 先从singleton中查找bean实例
        final Object singleton = getSingleton(beanName);
        if (singleton != null) {
            return singleton;
        }
        // 如果singleton中没有，就根据beanName获取对应的beanDefinition
        final BeanDefinition beanDefinition = getBeanDefinition(beanName);
        // 调用createBean()方法创建bean实例
        return createBean(beanName, beanDefinition);
    }

    /**
     * 根据bean名称获取bean定义
     *
     * @param beanName bean的名称
     * @return 返回bean的定义信息BeanDefinition
     */
    protected abstract BeanDefinition getBeanDefinition(String beanName);

    /**
     * 根据bean名称和其对应的定义信息BeanDefinition，创建并返回bean实例对象
     *
     * @param beanName       bean的名称
     * @param beanDefinition bean对应的定义信息
     * @return 返回bean实例对象
     */
    protected abstract Object createBean(String beanName, BeanDefinition beanDefinition);
}